还记得我们创建 AnimationController 时传递了一个 vsync
参数么,它是一个 TickerProvider
对象,其主要职责是创建一个 Ticker
,Flutter应用在启动时都会绑定一个 SchedulerBinding
,通过 SchedulerBinding
可以给每一次屏幕刷新添加回调,而 Ticker
就是通过 SchedulerBinding
来添加屏幕刷新回调,这样一来,每次屏幕刷新都会调用 TickerCallback
。使用 Ticker
来驱动动画会防止屏幕外动画(动画的UI不在当前屏幕时,如锁屏时)消耗不必要的资源,因为 Flutter 中屏幕刷新时会通知到绑定的 SchedulerBinding
,而 Ticker
是受 SchedulerBinding
驱动的,由于锁屏后屏幕会停止刷新,所以 Ticker
就不会再触发。
Flutter 允许我们将一个 State 设置为一个 Ticker,只需要包含 TickerProviderStateMixin
即可:
class AnimationRouteState extends State<AnimationRoute>
with TickerProviderStateMixin {
//......
}